class Printer {
public:
	vector<int> clockwisePrint(vector<vector<int>> mat, int n, int m) {
		vector<int> ans;
		// write code here
		int x1 = 0;
		int x2 = n - 1;
		int y1 = 0;
		int y2 = m - 1;
		while (x1 <= x2 && y1 <= y2) {
			// 上
			for (int i = y1; i <= y2; i++) {
				ans.push_back(mat[x1][i]);
			}
			
			// 右
			for (int i = x1 + 1; i < x2; i++) {
				ans.push_back(mat[i][y2]);
			}
			
			// 下边可能与 上边重复了, 所以需要另外判断 x1 和 x2 的关系
			// 下
			for (int i = y2; i >= y1 && x2 > x1; i--) {
				ans.push_back(mat[x2][i]);
			}
			
			// 左边可能与 右边重复了, 所以需要另外判断 y1 和 y2 的关系
			// 左
			for (int i = x2 - 1; i > x1 && y2 > y1; i--) {
				ans.push_back(mat[i][y1]);
			}
			
			x1++;
			x2--;
			y1++;
			y2--;
		}
		return ans;
	}
};
